package com.hundsun.documentripper.service.impl;

import com.hundsun.documentripper.domain.dto.FileSource;
import com.hundsun.documentripper.domain.pojo.Document;
import com.hundsun.documentripper.domain.pojo.DocumentVersion;
import com.hundsun.documentripper.domain.pojo.File;
import com.hundsun.documentripper.domain.pojo.FileHistory;
import com.hundsun.documentripper.mapper.FileHistoryMapper;
import com.hundsun.documentripper.mapper.FileMapper;
import com.hundsun.documentripper.service.DocumentService;
import com.hundsun.documentripper.service.FileNodeService;
import com.hundsun.documentripper.service.FileService;
import com.hundsun.documentripper.service.FileSourceService;
import com.hundsun.documentripper.service.NodeContentService;
import com.hundsun.documentripper.service.NodeTemplateService;
import com.hundsun.documentripper.service.UserLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.UUID;

/**
 * Note：
 *
 * @author ：mengjw
 * @description：文件元数据接口实现
 * @date ：Created in 2021/2/1
 */
@Service
public class FileSourceServiceImpl implements FileSourceService {

    @Autowired
    private DocumentService documentService;
    @Autowired
    private FileMapper fileMapper;
    @Autowired
    private FileHistoryMapper fileHistoryMapper;
    @Autowired
    private FileService fileService;
    @Autowired
    private FileNodeService fileNodeService;
    @Autowired
    private NodeTemplateService nodeTemplateService;
    @Autowired
    private NodeContentService nodeContentService;
    @Autowired
    private UserLogService userLogService;

    @Override
    public FileSource getFileSourceById(String uuid) {
        // 增加判断是否是历史数据
        FileSource fileSource;
        List fileNodeList;
        File file = fileMapper.selectById(uuid);
        if (null != file) {
            // 如果不是空，不是历史数据
            fileSource = FileSource.formFile(file);
            // 根据文件编号获取节点列表
            fileNodeList = fileNodeService.getFileNodeListById(uuid);
        } else {
            // 如果是空，需要从历史表读
            fileSource = FileSource.formFile(fileHistoryMapper.selectById(uuid));
            // 根据文件编号获取历史节点列表
            fileNodeList = fileNodeService.getFileNodeHistoryListById(uuid);
        }
        fileSource.setFileNodes(fileNodeList);
        // 获取依赖的节点模板列表和内容列表
        fileNodeService.getNodeTemplateViewsAndNodeContents(fileSource, fileNodeList);
        return fileSource;
    }

    @Override
    public FileSource saveFileSource(FileSource fileSource) {
        // 判断是否是历史数据
        File file = fileMapper.selectById(fileSource.getUuid());
        boolean isLast = false;
        if (null != file) {
            isLast = true;
        }
        // 更新文档数据
        Document document = documentService.getDocumentById(fileSource.getDocumentUuid());
        document.setVersionCount(document.getVersionCount() + 1);
        documentService.updateDocument(document);
        // 判断不是新增的文件
        int newVersion = fileSource.getDocumentVersion() + 1;
        if (newVersion > 1) {
            // 如果不是新增的文件
            // 备份老的文件，从当前表归档到历史表
            if (isLast) {
                fileService.backupFile(fileSource.getUuid());
            }
            // 生成新文件
            fileSource.setUuid(UUID.randomUUID().toString());
            fileSource.setDocumentVersion(newVersion);
            // 插入新文件
            if (isLast) {
                fileMapper.insert(fileSource);
            } else {
                fileHistoryMapper.insert(FileHistory.formFile(fileSource));
            }
            // 插入最新的文档版本数据
            DocumentVersion documentVersion = DocumentVersion.builder()
                    .documentUuid(document.getUuid())
                    .documentVersion(newVersion)
                    .productVersionUuid(fileSource.getProductVersionUuid())
                    .fileUuid(fileSource.getUuid())
                    .createUser(fileSource.getCreateUser())
                    .build();
            documentService.insertDocumentVersion(documentVersion);
        } else {
            // 如果是新增的文件，版本从0改为1
            fileSource.setDocumentVersion(newVersion);
            // 更新旧文件
            if (isLast) {
                fileMapper.updateById(fileSource);
            } else {
                fileHistoryMapper.updateById(FileHistory.formFile(fileSource));
            }
            // 保存最新的文档版本数据
            DocumentVersion documentVersion = DocumentVersion.builder()
                    .documentUuid(document.getUuid())
                    .documentVersion(newVersion)
                    .productVersionUuid(fileSource.getProductVersionUuid())
                    .fileUuid(fileSource.getUuid())
                    .createUser(fileSource.getCreateUser())
                    .build();
            documentService.updateNewDocumentVersion(documentVersion);
        }
        // 插入新的文件节点
        fileNodeService.saveFileNodeList(fileSource, fileSource.getFileNodes(), isLast);
        // 插入新的节点样式
        nodeTemplateService.saveNodeTemplateViewList(fileSource.getNodeTemplateViews());
        if (null != fileSource.getNodeContents() && !fileSource.getNodeContents().isEmpty()) {
            // 插入新的内容
            nodeContentService.insertNodeContentBatch(fileSource.getNodeContents());
        }
        // 保存日志
        userLogService.insertUserLog(fileSource.getCreateUser(), document.getProductUuid(), fileSource.getProductVersionUuid(),
                document.getUuid(), newVersion, fileSource.getUuid());
        // 全部处理完成后，获取依赖的节点模板列表和内容列表，返回全量的文件元数据
        fileNodeService.getNodeTemplateViewsAndNodeContents(fileSource, fileSource.getFileNodes());
        return fileSource;
    }


}